package com.bml.architect.batch;

import com.bml.architect.utils.MqConstants;
import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.remoting.exception.RemotingException;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

/**
 * 批量消息是指将多条消息合并成一个批量消息，一次发送出去。这样的好处是可以减少网络IO，提升吞
 * 吐量。
 * 如果批量消息大于1MB就不要用一个批次
 * 发送，而要拆分成多个批次消息发送。也就是说，一个批次消息的大小不要超过1MB
 * 实际使用时，这个1MB的限制可以稍微扩大点，实际最大的限制是4194304字节，大概4MB。但
 * 是使用批量消息时，这个消息长度确实是必须考虑的一个问题。而且批量消息的使用是有一定限
 * 制的，这些消息应该有相同的Topic，相同的waitStoreMsgOK。而且不能是延迟消息、事务消息
 * 等。
 */
public class BatchProducer {


    public static void main(String[] args) {
        DefaultMQProducer producer = new DefaultMQProducer("batchProducerGroup");
        try {
            producer.setNamesrvAddr(MqConstants.getNameServerAddr());
            producer.start();
            List<Message> messages = new ArrayList<>();
            for (int i = 0; i <1000 ; i++) {
                Message message = new Message("TopicTest", "TagBatch", "batch_"+i, ("rocketmq batch message is " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
                messages.add(message);
            }
            SendResult send = producer.send(messages);
            System.out.println(send);
            producer.shutdown();

        } catch (MQClientException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (RemotingException e) {
            e.printStackTrace();
        } catch (MQBrokerException e) {
            e.printStackTrace();
        }
    }
}
